package cn.virens.common.boot.rabbit;

import cn.virens.common.util.exception.APIException;
import org.dromara.hutool.core.reflect.ClassUtil;
import org.dromara.hutool.core.spi.MapServiceLoader;
import org.dromara.hutool.core.text.StrUtil;

public class RabbitManagerUtil {
    /**
     * 通过SPI加载路由KEY生成规则,如果未定义则使用下划线分隔的参数类型名称
     */
    public static String routingKey(Object data, String className) throws APIException {
        // 获取路由KEY生成规则---------------------------------------------------
        var loader = MapServiceLoader.of(RabbitRoutingKey.class, null);
        if (loader == null || className == null) {
            return "";
        }

        // 根据当前类型获取路由KEY生成规则-----------------------------------------
        var service = loader.getService(className);
        if (service != null && data != null) {
            return service.routingKey(data);
        }

        // 默认使用下划线分隔的参数类型名称-----------------------------------------
        return StrUtil.toSymbolCase(className, '_');
    }

    /**
     * 通过SPI加载路由KEY生成规则,如果未定义则使用下划线分隔的参数类型名称
     */
    public static String routingKey(Object data) throws APIException {
        if (data instanceof RabbitRoutingName nameFun) {
            return routingKey(data, nameFun.getServiceName());
        }

        return routingKey(data, ClassUtil.getClassName(data, true));
    }
}
